package com.ww.java8.fp.stream.inaction.ch05;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;

/**
 * 查找和匹配
 */
public class SearchAndMatchDemo {

    public static void main(String[] args) {
        /**
         * 检查谓词是否至少匹配一个元素
         */
        List<Integer> nums = Arrays.asList(1, 2, 3, 2, 3, 0, 4, 5, 6, 7, 8);
        System.out.println("未去重");
        nums.stream().forEach(e -> System.out.print(e + " "));
        System.out.println();

        /**
         * anyMatch
         */
        boolean anyMatch = nums.stream().anyMatch(i -> 0 == i.compareTo(0));
        if (anyMatch) {
            System.out.println("含有0元素");
        }

        /**
         * 所有都匹配
         * allMatch
         */
        boolean allMatch = nums.stream().allMatch(i -> i < 20);
        if (allMatch) {
            System.out.println("所有都匹配");
        }

        /**
         * 流中没有任何元素与给定的谓词匹配
         * noneMatch
         */
        boolean noneMatch = nums.stream().noneMatch(i -> i > 20);
        if (noneMatch) {
            System.out.println("没有匹配");
        }

        /**
         * 查找元素
         * findAny方法将返回当前流中的任意元素
         * Optional<T>
         * isPresent()将Optional包含值的时候返回true，否则返回false
         * ifPresent(Consumer<T> block)会在值存在的时候执行给定的代码块。
         * T get()会在值存在时返回值，否则抛出一个NoSuchElement异常
         * T orElse(T other)会在值存在时返回值，否则返回一个默认值
         */
        Optional<Integer> any = nums.stream().filter(i -> i < 5).findAny();

        /**
         * 返回一个Optional<Integer>，如果包含一个值就打印它
         */
        nums.stream().filter(i -> i < 5).findAny().ifPresent(System.out::println);

        /**
         * 查找第一个元素
         * findFirst
         *
         * findFirst和findAny对比
         * 为什么会同时有findFirst和findAny呢？答案是并行，找到第一个元素在并行上限制更多
         * 如果你不关心返回的元素是哪个，请使用findAny，因为它在使用并行流时限制较少
         */
        List<Integer> someNumbers = Arrays.asList(1, 2, 3, 4, 5);
        Optional<Integer> first = someNumbers.stream()
                .map(x -> x * x)
                .filter(x -> x % 3 == 0)
                .findFirst();
        if (first.isPresent()) {
            System.out.println("查找到第一个元素：" + first.get());
        }
    }
}
